﻿using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using Sinacor.Infra.Service.Validation;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;

namespace Sinacor.Servico.Bovespa.Corretagem.BusinessLogic
{
    /// <summary>
    /// Business Logic Faixa
    /// </summary>
    public class Faixa : BaseBusinessLogic
    {

        #region Constantes de Erro

        private const int ERRO_FAIXA_ACRECIMOINVALIDO = 000000;
        private const int ERRO_FAIXA_ALIQUOTAINVALIDA = 000001;
        private const int ERRO_FAIXA_QUANTIDADEVALORFINALINVALIDO = 000002;
        private const int ERRO_FAIXA_QUANTIDADEVALORFINALMAIORVALORINICIAL = 000003;
        private const int ERRO_FAIXA_QUANTIDADEVALORINICIALINVALIDO = 000004;

        #endregion

        #region Construtor
        public Faixa()
            : base()
        {

        }
        #endregion

        #region MÃ©todos

        /// <summary>
        /// MÃ©todo ConsultarFaixa
        /// </summary>
        public List<BusinessEntity.Faixa> ConsultarFaixa(BusinessEntity.Parameter.ConsultarFaixa consultarfaixa)
        {
            ResourceAccess.Faixa raFaixa = new Sinacor.Servico.Bovespa.Corretagem.ResourceAccess.Faixa();
            return raFaixa.ConsultarFaixa(consultarfaixa);
        }

        /// <summary>
        /// MÃ©todo ExcluirFaixa
        /// </summary>
        public void ExcluirFaixa(BusinessEntity.Parameter.ExcluirFaixa excluirfaixa)
        {
            ResourceAccess.Faixa raFaixa = new Sinacor.Servico.Bovespa.Corretagem.ResourceAccess.Faixa();
            raFaixa.ExcluirFaixa(excluirfaixa);
        }

        /// <summary>
        /// MÃ©todo SalvarFaixa
        /// </summary>
        public void SalvarFaixa(List<BusinessEntity.Faixa> faixa)
        {
            //Validar dados 
            ValidarFaixa(faixa);


            //Excluir items antigos referente a Tabela padrao
            foreach (BusinessEntity.Faixa item in faixa)
            {
                BusinessEntity.Parameter.ExcluirFaixa parameter = new Sinacor.Servico.Bovespa.Corretagem.BusinessEntity.Parameter.ExcluirFaixa();
                parameter.CodigoTabelaPadrao = item.CodigoTabelaPadrao;
                ExcluirFaixa(parameter);
            }

            //Efetuar inserÃ§Ã£o ou atualizaÃ§Ã£o da faixa
            ResourceAccess.Faixa raFaixa = new Sinacor.Servico.Bovespa.Corretagem.ResourceAccess.Faixa();
            raFaixa.SalvarFaixa(faixa);
        }

        /// <summary>
        /// MÃ©todo ValidarFaixa
        /// </summary>
        public void ValidarFaixa(List<BusinessEntity.Faixa> faixa)
        {
            foreach (BusinessEntity.Faixa item in faixa)
            {
                ValidarFaixa(item);
            }
        }

        public void ValidarFaixa(BusinessEntity.Faixa faixa)
        {
            if (faixa.BaseCalculo.TipoBaseCalculo != Sinacor.Servico.Bovespa.Corretagem.BusinessEntity.Enum.TipoBaseCalculo.Valores)
            {
                if ((faixa.QuantidadeValorInicial % Decimal.One) > Decimal.Zero)
                {
                    throw new BusinessException(ERRO_FAIXA_QUANTIDADEVALORINICIALINVALIDO);
                }

                if ((faixa.QuantidadeValorFinal % Decimal.One) > Decimal.Zero)
                {
                    throw new BusinessException(ERRO_FAIXA_QUANTIDADEVALORFINALINVALIDO);
                }
            }

            if (faixa.QuantidadeValorFinal < faixa.QuantidadeValorInicial)
            {
                throw new BusinessException(ERRO_FAIXA_QUANTIDADEVALORFINALMAIORVALORINICIAL);
            }

            if (faixa.Aliquota < Decimal.Zero)
            {
                throw new BusinessException(ERRO_FAIXA_ALIQUOTAINVALIDA);
            }

            if (faixa.Acrescimo < Decimal.Zero) 
            {
                throw new BusinessException(ERRO_FAIXA_ACRECIMOINVALIDO);
            }

        }

        
        #endregion

    }
}
